package ve.usb.crm;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.crm.hibernate.*;

import java.util.List;
import java.util.ArrayList;
import ve.usb.cohesion.runtime.Pair;

/**
 * 
 */
public class AccionesProyecto extends CohesionAction {

    /**
     * Called by Struts for the execution of action APreProyectos.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreProyectos(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VProyectos",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador, empleado
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            List<Proyecto> proyectos = (List<Proyecto>) s.createQuery("from Proyecto where esActivo = true").list();


            for (Proyecto p : proyectos) {
                Hibernate.initialize(p.getRespProyecto().getNombre());
            }

            request.setAttribute("L_Proyecto", proyectos);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreProyecto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreProyecto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VProyecto",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador, empleado
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            HttpSession sess = request.getSession();
            Long idProyecto = lookup_Long(request,"idProyecto");
          

            Proyecto proyecto = (Proyecto) s.load(Proyecto.class, idProyecto);
            proyecto.getRespProyecto().getNombre();

            List<Documento> documento = (List<Documento>) s.createQuery("from Documento where esProyecto = true and asociadoA =:idProyecto").setLong("idProyecto", proyecto.getIdProyecto()).list();
            request.setAttribute("L_Documentos", documento);

            FCrearComentario fFCrearComentario = new FCrearComentario();

            Categoria cate = (Categoria) s.createQuery("from Categoria where nombre = :cat").setString("cat", "Proyecto").uniqueResult();
            fFCrearComentario.setCategoria(cate.getIdCategoria());
            fFCrearComentario.setAsociadoA(idProyecto);

            List<Comentario> comentarios = (List<Comentario>) s.createQuery("from Comentario where asociadoA = :idProyecto and categoria = :idCategoria").setLong("idProyecto", idProyecto).setLong("idCategoria", cate.getIdCategoria()).list();

            for (Comentario c : comentarios) {
                c.getPersonal().getNombre();
            }

            sess.setAttribute("FCrearComentario", fFCrearComentario);
            request.setAttribute("L_Comentarios", comentarios);
            request.setAttribute("L_Documentos", documento);
            request.setAttribute("Proyecto", proyecto);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreEditarProyecto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreEditarProyecto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearProyecto",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador, empleado
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            HttpSession sess = request.getSession();
            Long idProyecto = (Long) sess.getAttribute("idProyecto");
            if (idProyecto == null) {
                idProyecto = (Long) request.getAttribute("idProyecto");
            }
            if (idProyecto == null) {
                idProyecto = new Long(request.getParameter("idProyecto"));
            }

            FCrearProyecto fFCrearProyecto = new FCrearProyecto();

            cargarCollection(fFCrearProyecto, s);

            Proyecto proyecto = (Proyecto) s.load(Proyecto.class, idProyecto);
            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            fFCrearProyecto.setNombre(proyecto.getNombre());
            if (proyecto.getAvisoDeVencimiento() != null) {
                fFCrearProyecto.setAvisoDeVencimiento(df.format(proyecto.getAvisoDeVencimiento()));
            }

            fFCrearProyecto.setCalleEnvio(proyecto.getCalleEnvio());
            fFCrearProyecto.setCalleFacturacion(proyecto.getCalleFacturacion());
            fFCrearProyecto.setCiudadEnvio(proyecto.getCiudadEnvio());
            fFCrearProyecto.setCiudadFacturacion(proyecto.getCiudadFacturacion());
            fFCrearProyecto.setCodigoPostalEnvio(proyecto.getCodigoPostalEnvio());
            fFCrearProyecto.setCodigoPostalFacturacion(proyecto.getCodigoPostalFacturacion());
            fFCrearProyecto.setCondicionesEspeciales(proyecto.getCondicionesEspeciales());
            fFCrearProyecto.setDescripcion(proyecto.getDescripcion());
            fFCrearProyecto.setEstadoEnvio(proyecto.getEstadoEnvio());
            fFCrearProyecto.setEstadoFacturacion(proyecto.getEstadoFacturacion());
            fFCrearProyecto.setDuracion(proyecto.getDuracion());
            fFCrearProyecto.setPorcentajeCompletado(proyecto.getPorcentajeCompletado());
            
            if (proyecto.getFechaFirma() != null) {
                fFCrearProyecto.setFechaFirma(df.format(proyecto.getFechaFirma()));
            }
            if (proyecto.getFechaFirmaCompanya() != null) {
                fFCrearProyecto.setFechaFirmaCompanya(df.format(proyecto.getFechaFirmaCompanya()));
            }

            if (proyecto.getFechaInicioContrato() != null) {
                fFCrearProyecto.setFechaInicioContrato(df.format(proyecto.getFechaInicioContrato()));
            }


            fFCrearProyecto.setFirmadoCliente(proyecto.getFirmadoCliente());
            fFCrearProyecto.setFirmadoCompanya(proyecto.getFirmadoCompanya());
            fFCrearProyecto.setIdProyecto(proyecto.getIdProyecto());
            fFCrearProyecto.setPaisEnvio(proyecto.getPaisEnvio());
            fFCrearProyecto.setPaisFacturacion(proyecto.getPaisFacturacion());
            fFCrearProyecto.setRespProyecto(proyecto.getRespProyecto().getIdPersonal());
            fFCrearProyecto.setTituloFirma(proyecto.getTituloFirma());
            fFCrearProyecto.setCuenta(proyecto.getCuenta().getIdCuenta());

            sess.setAttribute("FCrearProyecto", fFCrearProyecto);
            request.setAttribute("Proyecto", proyecto);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action ACrearProyecto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward ACrearProyecto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreProyecto", "VCrearProyecto", "APreProyectos",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;
        final int SALIDA_2 = 2;

        int salida = SALIDA_0;
        //Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCrearProyecto fFCrearProyecto = (FCrearProyecto) form;
            Proyecto proyecto = new Proyecto();
            boolean hayError = false;
            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

            if (fFCrearProyecto.getIdProyecto() != 0l) {
                proyecto = (Proyecto) s.load(Proyecto.class, fFCrearProyecto.getIdProyecto());
            }

            if (fFCrearProyecto.getNombre().equals("")) {
                hayError = true;
                request.setAttribute("nombreError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Introduzca un nombre de proyecto v&aacute;lido");
            }

            if (fFCrearProyecto.getCuenta() == 0) {
                hayError = true;
                request.setAttribute("cuentaError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Seleccione una cuenta v&aacute;lida");
            }

            if (fFCrearProyecto.getRespProyecto() == 0) {
                hayError = true;
                request.setAttribute("respProyectoError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Seleccione un responsable del proyecto v&aacute;lido");
            }

            if (fFCrearProyecto.getCodigoPostalEnvio() < 0 || fFCrearProyecto.getCodigoPostalFacturacion() < 0) {
                hayError = true;
                request.setAttribute("codigoPostalError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Indique un c&oacute;digo postal v&aacute;lido");
            }

            if (hayError) {
                cargarCollection(fFCrearProyecto, s);
                salida = SALIDA_1;
            } else {
                df = new SimpleDateFormat("dd/MM/yyyy");
                proyecto.setNombre(fFCrearProyecto.getNombre());
                if (fFCrearProyecto.getAvisoDeVencimiento().compareTo("") != 0) {
                    proyecto.setAvisoDeVencimiento(df.parse(fFCrearProyecto.getAvisoDeVencimiento()));
                }

                proyecto.setCalleEnvio(fFCrearProyecto.getCalleEnvio());
                proyecto.setCalleFacturacion(fFCrearProyecto.getCalleFacturacion());
                proyecto.setCiudadEnvio(fFCrearProyecto.getCiudadEnvio());
                proyecto.setCiudadFacturacion(fFCrearProyecto.getCiudadFacturacion());
                proyecto.setCodigoPostalEnvio(fFCrearProyecto.getCodigoPostalEnvio());
                proyecto.setCodigoPostalFacturacion(fFCrearProyecto.getCodigoPostalFacturacion());
                proyecto.setCondicionesEspeciales(fFCrearProyecto.getCondicionesEspeciales());
                proyecto.setDescripcion(fFCrearProyecto.getDescripcion());
                proyecto.setEstadoEnvio(fFCrearProyecto.getEstadoEnvio());
                proyecto.setEstadoFacturacion(fFCrearProyecto.getEstadoFacturacion());
                proyecto.setDuracion(fFCrearProyecto.getDuracion());
                proyecto.setPorcentajeCompletado(fFCrearProyecto.getPorcentajeCompletado());

                df = new SimpleDateFormat("dd/MM/yyyy");
                if (!fFCrearProyecto.getFechaFirma().equals("")) {
                    proyecto.setFechaFirma(df.parse(fFCrearProyecto.getFechaFirma()));
                } else {
                    proyecto.setFechaFirma(null);
                }
                if (!fFCrearProyecto.getFechaFirmaCompanya().equals("")) {
                    proyecto.setFechaFirmaCompanya(df.parse(fFCrearProyecto.getFechaFirmaCompanya()));
                } else {
                    proyecto.setFechaFirmaCompanya(null);
                }
                if (!fFCrearProyecto.getFechaInicioContrato().equals("")) {
                    proyecto.setFechaInicioContrato(df.parse(fFCrearProyecto.getFechaInicioContrato()));
                } else {
                    proyecto.setFechaInicioContrato(null);
                }

                proyecto.setFirmadoCliente(fFCrearProyecto.getFirmadoCliente());
                proyecto.setFirmadoCompanya(fFCrearProyecto.getFirmadoCompanya());
                proyecto.setPaisEnvio(fFCrearProyecto.getPaisEnvio());
                proyecto.setPaisFacturacion(fFCrearProyecto.getPaisFacturacion());
                proyecto.setRespProyecto((Personal) s.load(Personal.class, fFCrearProyecto.getRespProyecto()));
                proyecto.setTituloFirma(fFCrearProyecto.getTituloFirma());
                proyecto.setCuenta((Cuenta) s.load(Cuenta.class, fFCrearProyecto.getCuenta()));
                proyecto.setEsActivo(true);
                if (fFCrearProyecto.getOportunidad() != 0l) {
                    Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, fFCrearProyecto.getOportunidad());
                    oportunidad.setConcretado(true);
                    s.update(oportunidad);
                    s.flush();
                }

                if (fFCrearProyecto.getIdProyecto() != 0l) {
                    s.update(proyecto);
                } else {
                    s.save(proyecto);
                    salida = SALIDA_2;
                }
            }
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action AEliminarProyecto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward AEliminarProyecto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreProyectos",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            HttpSession sess = request.getSession();
            Long idProyecto = (Long) sess.getAttribute("idProyecto");
            if (idProyecto == null) {
                idProyecto = (Long) request.getAttribute("idProyecto");
            }
            if (idProyecto == null) {
                idProyecto = new Long(request.getParameter("idProyecto"));
            }

            Proyecto proyecto = (Proyecto) s.load(Proyecto.class, idProyecto);
            proyecto.setEsActivo(false);
            s.update(proyecto);
            s.flush();
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreCrearProyecto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreCrearProyecto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearProyecto",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            HttpSession sess = request.getSession();
            FCrearProyecto fFCrearProyecto = new FCrearProyecto();
            cargarCollection(fFCrearProyecto, s);

            Long opo = lookup_Long(request,"idOportunidad");
            if (opo != null) {
                Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, opo);
                Cuenta cuenta = (Cuenta) oportunidad.getCuenta();

                fFCrearProyecto.setCuenta(cuenta.getIdCuenta());
                fFCrearProyecto.setNombre(oportunidad.getNombre());
                fFCrearProyecto.setOportunidad(opo);
            }
            Personal personal = (Personal) request.getSession().getAttribute("Usuario");
            fFCrearProyecto.setRespProyecto(personal.getIdPersonal());


            sess.setAttribute("FCrearProyecto", fFCrearProyecto);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    private void cargarCollection(FCrearProyecto fFCrearProyecto, Session s) {
        // Creo la lista del personal responsable al proyecto
        // para ser mostrados en el formulario
        List<Personal> personal = (List<Personal>) s.createQuery("from Personal").list();
        List<Pair> list = new ArrayList<Pair>();
        for (Personal pe : personal) {
            list.add(new Pair(pe.getNombre(), pe.getIdPersonal()));
        }
        list.add(0, new Pair("Seleccione...", 0));

        List<Cuenta> cuenta = (List<Cuenta>) s.createQuery("from Cuenta").list();
        List<Pair> list2 = new ArrayList<Pair>();
        for (Cuenta cu : cuenta) {
            list2.add(new Pair(cu.getNombre(), cu.getIdCuenta()));
        }
        list2.add(0, new Pair("Seleccione...", 0));

        fFCrearProyecto.setListPersonal(list);
        fFCrearProyecto.setListCuenta(list2);
    }
}
